package com.xxgc.qinglian.qinglianserver.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xxgc.qinglian.qinglianserver.controller.dto.UserLoginDTO;
import com.xxgc.qinglian.qinglianserver.entity.UserEntity;
import com.xxgc.qinglian.qinglianserver.entity.UserEntityRepository;
import com.xxgc.qinglian.qinglianserver.result.Result;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Map;

@RestController
@RequestMapping("/login")
@Tag(name = "登录接口")
public class LoginController {

    @Autowired
    private UserEntityRepository usersEntityRepository;

    // 静态变量用于存储全局用户类型
    private static Integer globalUserType = null;

    // 新增：检查浏览器注册状态
    @GetMapping("/checkBrowserRegistration")
    public Result checkBrowserRegistration(HttpServletRequest request) {
        // 这里可以添加更复杂的浏览器指纹逻辑
        // 简化版：直接返回成功，由前端处理本地存储
        return Result.success().msg("浏览器注册状态检查");
    }

    @GetMapping("/getMsg")
    public Result getMsg1() {
        return Result.success("获取成功");
    }

    @PostMapping("/userLogin")
    public Result userLogin(@RequestBody Map<String, Object> map, HttpServletRequest request) {
        String action = (String) map.get("action");
        String username = (String) map.get("username");
        String nickname = (String) map.get("nickname");
        String password = (String) map.get("password");
        // 获取当前时间，转换为 LocalDateTime 格式后再赋值给实体类属性
        LocalDateTime now = LocalDateTime.now();

        if ("register".equals(action)) {
            // 获取全局用户类型，如果为空则默认是 1
            Integer userType = globalUserType != null ? globalUserType : 1;

            // 条件构造器
            QueryWrapper<UserEntity> qw = new QueryWrapper<>();
            qw.eq("username", username);
            // 查询一条
            UserEntity user = usersEntityRepository.getOne(qw);
            if (user == null) {
                // 插入数据
                UserEntity newUser = new UserEntity();
                newUser.setUsername(username);
                newUser.setNickname(nickname);
                newUser.setPassword(password);
                newUser.setUserType(userType);
                newUser.setStatus(1);
                newUser.setCreateTime(now);
                newUser.setAvatar("https://fastly.picsum.photos/id/999/200/200.jpg?hmac=iwXALEStJtHL4Thxk_YbLNHNmjq9ZrIQYFUvtxndOaU");
                usersEntityRepository.save(newUser);

                // 获取用户登陆的 id
                String id = newUser.getUserId();
                // 加密这个 id 保存到会话中
                StpUtil.login(id);
                // 获取 token
                String tokenValue = StpUtil.getTokenValue();
                // 封装一个 DTO UserLoginDTO
                UserLoginDTO userLoginDTO = new UserLoginDTO();
                userLoginDTO.setToken(tokenValue);
                userLoginDTO.setId(newUser.getUserId());
                userLoginDTO.setNickname(newUser.getNickname());
                userLoginDTO.setUsername(newUser.getUsername());
                return Result.success(userLoginDTO).msg("注册成功").code(11012);
            } else {
                return Result.fail("手机号已存在");
            }
        } else if ("login".equals(action)) {
            // 条件构造器
            QueryWrapper<UserEntity> qw = new QueryWrapper<>();
            qw.eq("username", username);
            UserEntity user = usersEntityRepository.getOne(qw);
            if (user == null) {
                return Result.fail("手机号不存在");
            }
            qw.eq("password", password);
            // 查询一条
            UserEntity user1 = usersEntityRepository.getOne(qw);
            if (user1 == null) {
                return Result.fail("密码错误");
            } else {
                // 获取用户登陆的 id
                String id = user.getUserId();
                // 加密这个 id 保存到会话中
                StpUtil.login(id);
                // 获取 token
                String tokenValue = StpUtil.getTokenValue();

                // 封装一个 DTO UserLoginDTO
                UserLoginDTO userLoginDTO = new UserLoginDTO();
                userLoginDTO.setToken(tokenValue);
                userLoginDTO.setId(user.getUserId());
                userLoginDTO.setNickname(user.getNickname());
                userLoginDTO.setUsername(user.getUsername());
                userLoginDTO.setPhone(user.getPhone());
                return Result.success(userLoginDTO).msg("欢迎使用").code(200);
            }
        }
        return Result.fail("未知操作");
    }

    // 修改用户类型，用户类型：0-场外，1-场内，传入要修改的用户类型
    @PostMapping("/userUpdateType")
    public Result userUpdateType(@RequestBody Map<String, Object> map) {
        Integer userType = (Integer) map.get("userType");
        if (userType != null) {
            // 清空旧的用户类型值
            globalUserType = null;
            // 存储新的用户类型值
            globalUserType = userType;
            return Result.success().msg("用户类型修改成功");
        } else {
            return Result.fail("用户类型不能为空");
        }
    }

    // 修改用户密码
    @PostMapping("/userUpdatePass")
    public Result userUpdatePass(@RequestBody Map<String, Object> map) {
        String oldPassword = (String) map.get("oldPassword");
        String newPassword = (String) map.get("newPassword");
        String userId = StpUtil.getLoginIdAsString();
        UserEntity user = usersEntityRepository.getById(userId);
        if (user == null) {
            return Result.fail("用户不存在");
        }
        if (!user.getPassword().equals(oldPassword)) {
            return Result.fail("旧密码错误");
        }
        user.setPassword(newPassword);
        boolean updated = usersEntityRepository.updateById(user);
        return updated ? Result.success().msg("修改成功") : Result.fail("修改失败");
    }
}